/**
 * Trabajo de Ingeniería de Software 2
 * Año 2008
 * Sistema de Reserva de Recursos.
 * Desarrolladores: - Marcelo Ferreira.
 *                  - Christian Gómez.
 *                  - Marcelo Rodas.
 */
package controller;

import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.faces.application.FacesMessage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.faces.FacesException;
import java.util.HashMap;
import java.util.Vector;
import javax.faces.validator.ValidatorException;
import javax.servlet.http.HttpSession;
import javax.transaction.UserTransaction;
import modelo.Datospersonales;
//import modelo.Estadosolicitud;
import modelo.Estadosolicitud;
import modelo.Solicitudusuario;
import modelo.Usuario;

/**
 * Controlador de las Funcionalidades de una Solicitud de Usuario.
 * Utilizado para manejar la capa de controlador (MVC)
 * del sistema.
 * @author jmferreira
 * @version 1.0
 */
public class SolicitudusuarioController {
    //JPA Solicitud Usuario

    private Solicitudusuario solicitudusuario = null;
    //Lista de Solicitudes de usuario
    private List<Solicitudusuario> solicitudusuarios = null;
    //Transaccion del usuario
    @Resource
    private UserTransaction utx = null;
    // Administrador de la Persistencia de la Solicitud de Reserva.
    // Relaciona al Controlador con el Modelo (MVC)
    @PersistenceUnit(unitName = "sistemaReservaPU")
    private EntityManagerFactory emf = null;

    /**
     * Obtiene el Administrador de Entidades.
     * @return EntityManager
     */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    // ---------- Variables para paginar en el jsp -------------
    // variable auxiliar que indica el tamaño de conjunto
    public int batchSize = 100;
    private int firstItem = 0;
    private int itemCount = -1;

    /**
     * Contructor por defecto de la clase SolicitudusuarioController
     */
    public SolicitudusuarioController() {
        FacesContext context = FacesContext.getCurrentInstance();
        context.getExternalContext().getSessionMap().put("solicitudusuario_listSolicitudesPendientesAprobador", this);
    }

    /**
     * Obtiene el listado de Solicitudusuario en una lista iterada con selección multiple
     * @return La lista de Solicitudusuario
     */
    /*
    public SelectItem[] getSolicitudusuariosAvailableSelectMany() {
    return getSolicitudusuariosAvailable(false);
    }
     */
    /**
     * Obtiene el listado de Solicitudusuario en una lista iterada con seleccion individual
     * @return La lista de Solicitudusuario
     */
    /*
    public SelectItem[] getSolicitudusuariosAvailableSelectOne() {
    return getSolicitudusuariosAvailable(true);
    }
     */
    /**
     * Obtiene el listado de Solicitudusuario en una lista iterada
     * @return La lista de Solicitudusuario
     */
    /*
    private SelectItem[] getSolicitudusuariosAvailable(boolean one) {
    List<Solicitudusuario> allSolicitudusuarios = getSolicitudusuarios(true);
    int size = one ? allSolicitudusuarios.size() + 1 : allSolicitudusuarios.size();
    SelectItem[] items = new SelectItem[size];
    int i = 0;
    if (one) {
    items[0] = new SelectItem("", "---");
    i++;
    }
    for (Solicitudusuario x : allSolicitudusuarios) {
    items[i++] = new SelectItem(x, x.toString());
    }
    return items;
    }
     */
    /**
     * Obtiene la la Solicitudusuario si es que existe, y si no, crea una nueva instancia
     * @return La Solicitudusuario
     */
    public Solicitudusuario getSolicitudusuario() {
        if (solicitudusuario == null) {
            solicitudusuario = getSolicitudusuarioFromRequest();
        }
        if (solicitudusuario == null) {
            solicitudusuario = new Solicitudusuario();
        }
        return solicitudusuario;
    }
    /**
     * Metodo para resetear los valores de inicio y llamar al Tag de Lista de Solicitudusuario
     * @return el tag de la Lista de Solicitudusuario
     */

    public String listSetup() {
        reset(true);
        return "solicitudusuario_list";
    }

    /**
     * Obtiene el tag solicitudusuario_listSolicitudesPendientesAprobador para la navegacion del listSolicitudesPendientesAprobador.jsp
     * @return el tag solicitudusuario_listSolicitudesPendientesAprobador 
     */
    public String listSolicitudesPendientesAprobador() {
        reset(true);
        return "solicitudusuario_listSolicitudesPendientesAprobador";
    }

    /**
     * Obtiene el tag solicitudusuario_listSolicitudesPendientesSolicitante para la navegacion del listSolicitudesPendientesAprobador.jsp
     * @return el tag solicitudusuario_listSolicitudesPendientesSolicitante 
     */

    /*
    public String listSolicitudesPendientesSolicitante() {
    reset(true);
    return "solicitudusuario_listSolicitudesPendientesSolicitante";
    }
     */

    /*
    public String createSetup() {
    reset(false);
    solicitudusuario = new Solicitudusuario();
    return "solicitudusuario_create";
    }
    
    public String detailSetup() {
    return scalarSetup("solicitudusuario_detail");
    }
    
    public String editSetup() {
    return scalarSetup("solicitudusuario_edit");
    }
     */
    /**
     * Obtiene el tag solicitudusuario_aprobar para la navegacion del aprobarSolicitudUsuario.jsp
     * @return el tag solicitudusuario_aprobar 
     */
    public String aprobarSetup() {
        return scalarSetup("solicitudusuario_aprobar");
    }

    /**
     * Obtiene el tag solicitudusuario_rechazar para la navegacion del rechazarSolicitudUsuario.jsp
     * @return el tag solicitudusuario_rechazar 
     */
    public String rechazarSetup() {
        return scalarSetup("solicitudusuario_rechazar");
    }
    /*
     * Función de Navegación General, controla si existe la ruta de
     * navegación.
     */

    private String scalarSetup(String destination) {
        reset(false);
        solicitudusuario = getSolicitudusuarioFromRequest();
        if (solicitudusuario == null) {
            String requestSolicitudusuarioString = getRequestParameter("jsfcrud.currentSolicitudusuario");
            addErrorMessage("The solicitudusuario with id " + requestSolicitudusuarioString + " no longer exists.");
            String relatedControllerOutcome = relatedControllerOutcome();
            if (relatedControllerOutcome != null) {
                return relatedControllerOutcome;
            }
            return listSetup();
        }
        return destination;
    }

    /**
     * Realiza la transaccion de usuario que se encarga de aporbar una solicitudusuario.
     * Para ello realiza el chequeo de todos los valores antes de realizar el matcheo con los
     * atributos del JPA de la Base de Datos. Se encarga ademas de la creacion del respectivo
     * usuario/contraseña de sesion
     * @return El tag de la pagina que lista las solicitudes usuario pendientes
     */
    public String aprobar() {
        SolicitudusuarioConverter converter = new SolicitudusuarioConverter();
        String solicitudusuarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, solicitudusuario);
        //Obtiene la clave de la solicitud usuario a aprobar
        String currentSolicitudusuarioString = getRequestParameter("jsfcrud.currentSolicitudusuario");
        //Verifica que exista la solicitud usario o que se haya seleccionado alguna disponible
        if (solicitudusuarioString == null || solicitudusuarioString.length() == 0 || !solicitudusuarioString.equals(currentSolicitudusuarioString)) {
            String outcome = aprobarSetup();
            if ("solicitudusuario_aprobar".equals(outcome)) {
                addErrorMessage("Could not aprobar solicitudusuario. Try again.");
            }
            return outcome;
        }
        //Valida la longitud de la contraseña
        if (this.getContrasenha().length() < 5) {
            String message = "La contraseña debe tener al menos 5 caracteres.";
            addErrorMessage(message);
            return null;
        }
        //Verifica que la cuenta asignada no pertenezca a otro usuario existente
        if (this.crearUsuario().equals("0")) {
            addErrorMessage("EL USUARIO ESPECIFICADO YA EXISTE... por favor asigne otra cuenta e intente de nuevo.");
            return "";
        }
        //Obtiene el administrador de entidades
        EntityManager em = getEntityManager();
        try {
            utx.begin();
            //-- Se asigna todos los valores necesarios para la aprobacion --
            Solicitudusuario persistentSolicitudusuario = em.find(Solicitudusuario.class, solicitudusuario.getIdsolicitudusuario());
            Datospersonales iddatospersonalesOld = persistentSolicitudusuario.getIddatospersonales();
            Datospersonales iddatospersonalesNew = solicitudusuario.getIddatospersonales();
            Estadosolicitud idEstadoSolicitudOld = persistentSolicitudusuario.getIdEstadoSolicitud();
            Estadosolicitud idEstadoSolicitudNew = new Estadosolicitud(1); //Estado 1-APROBADO

            if (iddatospersonalesNew != null) {
                iddatospersonalesNew = em.getReference(iddatospersonalesNew.getClass(), iddatospersonalesNew.getIddatospersonales());
                solicitudusuario.setIddatospersonales(iddatospersonalesNew);
            }
            if (idEstadoSolicitudNew != null) {
                solicitudusuario.setIdEstadoSolicitud(idEstadoSolicitudNew);
            }
            solicitudusuario = em.merge(solicitudusuario);
            if (iddatospersonalesOld != null && !iddatospersonalesOld.equals(iddatospersonalesNew)) {
                iddatospersonalesOld.getSolicitudusuarioCollection().remove(solicitudusuario);
                iddatospersonalesOld = em.merge(iddatospersonalesOld);
            }
            if (iddatospersonalesNew != null && !iddatospersonalesNew.equals(iddatospersonalesOld)) {
                iddatospersonalesNew.getSolicitudusuarioCollection().add(solicitudusuario);
                iddatospersonalesNew = em.merge(iddatospersonalesNew);
            }
            //Para la audioria, que dispara el trigger de auditoria
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            Usuario usuarioLogeado = (Usuario) session.getAttribute("user");
            solicitudusuario.setUserAudita(usuarioLogeado.getIdUsuario());

            utx.commit();
            addSuccessMessage("Solicitud de Usuario fue aprobada exitosamente.");
        } catch (Exception ex) { //Maneja el evento de la transaccion del usuario

            try {
                String msg = ex.getLocalizedMessage();
                if (msg != null && msg.length() > 0) {
                    addErrorMessage(msg);
                } else if (getSolicitudusuarioFromRequest() == null) {
                    addErrorMessage("The solicitudusuario with id " + currentSolicitudusuarioString + " no longer exists.");
                    utx.rollback();
                    return listSetup();
                } else {
                    addErrorMessage("A persistence error occurred.");
                }
                utx.rollback();
            } catch (Exception e) { //Maneja el evento de la transaccion rollback

                ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
            }
            return null;
        } finally {
            em.close();
        }
        return listSolicitudesPendientesAprobador();

    }

    /**
     * Realiza la transaccion de usuario que se encarga de rechazar una solicitudusuario.
     * Para ello realiza el chequeo de todos los valores antes de realizar el matcheo con los
     * atributos del JPA de la Base de Datos
     * @return El tag de la pagina que lista las solicitudes usuarios pendientes
     */
    public String rechazar() {
        SolicitudusuarioConverter converter = new SolicitudusuarioConverter();
        String solicitudusuarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, solicitudusuario);
        //Obtiene la clave de la solicitud usuario a rechazar
        String currentSolicitudusuarioString = getRequestParameter("jsfcrud.currentSolicitudusuario");
        //Verifica que exista la solicitud reserva o que se haya seleccionado alguna disponible
        if (solicitudusuarioString == null || solicitudusuarioString.length() == 0 || !solicitudusuarioString.equals(currentSolicitudusuarioString)) {
            String outcome = aprobarSetup();
            if ("solicitudusuario_rechazar".equals(outcome)) {
                addErrorMessage("Could not rechazar solicitudusuario. Try again.");
            }
            return outcome;
        }
        //Obtiene el administador de entidades
        EntityManager em = getEntityManager();
        try {
            utx.begin();
            //-- Se asigna todos los valores necesarios para el rechazo --
            Solicitudusuario persistentSolicitudusuario = em.find(Solicitudusuario.class, solicitudusuario.getIdsolicitudusuario());
            Datospersonales iddatospersonalesOld = persistentSolicitudusuario.getIddatospersonales();
            Datospersonales iddatospersonalesNew = solicitudusuario.getIddatospersonales();
            Estadosolicitud idEstadoSolicitudOld = persistentSolicitudusuario.getIdEstadoSolicitud();
            Estadosolicitud idEstadoSolicitudNew = new Estadosolicitud(2); //Estado 1-APROBADO

            if (iddatospersonalesNew != null) {
                iddatospersonalesNew = em.getReference(iddatospersonalesNew.getClass(), iddatospersonalesNew.getIddatospersonales());
                solicitudusuario.setIddatospersonales(iddatospersonalesNew);
            }
            if (idEstadoSolicitudNew != null) {
                solicitudusuario.setIdEstadoSolicitud(idEstadoSolicitudNew);
            }
            solicitudusuario = em.merge(solicitudusuario);
            if (iddatospersonalesOld != null && !iddatospersonalesOld.equals(iddatospersonalesNew)) {
                iddatospersonalesOld.getSolicitudusuarioCollection().remove(solicitudusuario);
                iddatospersonalesOld = em.merge(iddatospersonalesOld);
            }
            if (iddatospersonalesNew != null && !iddatospersonalesNew.equals(iddatospersonalesOld)) {
                iddatospersonalesNew.getSolicitudusuarioCollection().add(solicitudusuario);
                iddatospersonalesNew = em.merge(iddatospersonalesNew);
            }
            //Para la audioria, que dispara el trigger de auditoria
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            Usuario usuarioLogeado = (Usuario) session.getAttribute("user");
            solicitudusuario.setUserAudita(usuarioLogeado.getIdUsuario());

            utx.commit();
            addSuccessMessage("Solicitud de Usuario fue rechazada exitosamente.");
        } catch (Exception ex) { //Maneja el evento de la transaccion de usuario

            try {
                String msg = ex.getLocalizedMessage();
                if (msg != null && msg.length() > 0) {
                    addErrorMessage(msg);
                } else if (getSolicitudusuarioFromRequest() == null) {
                    addErrorMessage("The solicitudusuario with id " + currentSolicitudusuarioString + " no longer exists.");
                    utx.rollback();
                    return listSetup();
                } else {
                    addErrorMessage("A persistence error occurred.");
                }
                utx.rollback();
            } catch (Exception e) { //Maneja el evento del rollback de la transaccion

                ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
            }
            return null;
        } finally {
            em.close();
        }
        return listSolicitudesPendientesAprobador();

    }

    /**
     * Obtiene una instancia de la Solicitudusuario de la peticion
     * @return Solicitudusuario La Solicitudusuario encontrada
     */
    private Solicitudusuario getSolicitudusuarioFromRequest() {
        String theId = getRequestParameter("jsfcrud.currentSolicitudusuario");
        return (Solicitudusuario) new SolicitudusuarioConverter().getAsObject(FacesContext.getCurrentInstance(), null, theId);
    }
    /*
     * Función para obtener un valor del request.
     */

    private String getRequestParameter(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
    }
    /*
    public List<Solicitudusuario> getSolicitudusuarios() {
    if (solicitudusuarios == null) {
    solicitudusuarios = getSolicitudusuarios(false);
    }
    return solicitudusuarios;
    }
    
    public List<Solicitudusuario> getSolicitudusuarios(boolean all) {
    EntityManager em = getEntityManager();
    try {
    Query q = em.createQuery("select object(o) from Solicitudusuario as o");
    if (!all) {
    q.setMaxResults(batchSize);
    q.setFirstResult(getFirstItem());
    }
    return q.getResultList();
    } finally {
    em.close();
    }
    }
     */

    /**
     * Obtiene la lista iterada de SolicitudUsuarios pendientes
     * @return La lista iterada de SolicitudUsuarios pendientes
     * Si el objeto actual es nulo, retorna la nueva lista de pendientes,
     * caso contrario, retorna la lista de pendientes actual
     */
    public List<Solicitudusuario> getSolicitudusuariosPendientes() {
        if (solicitudusuarios == null) {
            solicitudusuarios = getSolicitudusuariosPendientes(false);
        }
        return solicitudusuarios;
    }

    /**
     * Obtiene la lista iterada de una SolicitudUsuarios pendinte
     * @param all Un boolean indicando que se recupere todos los valores
     * @return La lista iterada de pendientes
     */
    public List<Solicitudusuario> getSolicitudusuariosPendientes(boolean all) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Solicitudusuario as o where o.idEstadoSolicitud.idEstadoSolicitud=3");
            if (!all) {
                q.setMaxResults(batchSize);
                q.setFirstResult(getFirstItem());
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /**
     * Asegura que se obtenga el error correcto y agrega un mensaje por defecto
     * si no localiza el origen del error
     */
    private void ensureAddErrorMessage(Exception ex, String defaultMsg) {
        String msg = ex.getLocalizedMessage();
        if (msg != null && msg.length() > 0) {
            addErrorMessage(msg);
        } else {
            addErrorMessage(defaultMsg);
        }
    }

    /**
     * Agrega mensajes de Error para la Página.
     * @param msg El mensaje a ser agregado a la pagina
     */
    public static void addErrorMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
        FacesContext.getCurrentInstance().addMessage(null, facesMsg);
    }

    /**
     * Agrega mensajes de éxito para la Página.
     * @param msg El mensaje a ser agregado a la pagina
     */
    public static void addSuccessMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
        FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
    }

    /**
     * Obtiene una Solicitudusuario con el id correspondiente.
     * @param id El idSolicitudusuario correspondiente
     * @return Solicitudusuario
     */
    public Solicitudusuario findSolicitudusuario(Integer id) {
        EntityManager em = getEntityManager();
        try {
            Solicitudusuario o = (Solicitudusuario) em.find(Solicitudusuario.class, id);
            return o;
        } finally {
            em.close();
        }
    }

    /**
     * Obtiene la cantidad de items de la Solicitudusuario
     * @return La cantidad de items
     */
    public int getItemCount() {
        if (itemCount == -1) {
            EntityManager em = getEntityManager();
            try {
                itemCount = ((Long) em.createQuery("select count(o) from Solicitudusuario as o").getSingleResult()).intValue();
            } finally {
                em.close();
            }
        }
        return itemCount;
    }

    /**
     * Obtiene el primer item de la Solicitudusuario
     * @return El primer item
     */
    public int getFirstItem() {
        getItemCount();
        if (firstItem >= itemCount) {
            if (itemCount == 0) {
                firstItem = 0;
            } else {
                int zeroBasedItemCount = itemCount - 1;
                double pageDouble = zeroBasedItemCount / batchSize;
                int page = (int) Math.floor(pageDouble);
                firstItem = page * batchSize;
            }
        }
        return firstItem;
    }

    /**
     * Obtiene el ultimo item de la Solicitudusuario
     * @return El ultimo item
     */
    public int getLastItem() {
        getFirstItem();
        return firstItem + batchSize > itemCount ? itemCount : firstItem + batchSize;
    }

    /**
     * Obtiene tamaño del buffer para desplegar la lista
     * @return El tamaño del buffer
     */
    public int getBatchSize() {
        return batchSize;
    }

    /**
     * Obtiene la siguiente coleccion de items de solicitudusuario
     * conforme al BatchSize
     * @return La siguiente coleccion de items
     */
    public String next() {
        reset(false);
        getFirstItem();
        if (firstItem + batchSize < itemCount) {
            firstItem += batchSize;
        }
        return "solicitudusuario_list";
    }

    /**
     * Obtiene la anterior coleccion de items de solicitudusuario
     * conforme al BatchSize
     * @return La anterior coleccion de items
     */
    public String prev() {
        reset(false);
        getFirstItem();
        firstItem -= batchSize;
        if (firstItem < 0) {
            firstItem = 0;
        }
        return "solicitudusuario_list";
    }

    private String relatedControllerOutcome() {
        String relatedControllerString = getRequestParameter("jsfcrud.relatedController");
        String relatedControllerTypeString = getRequestParameter("jsfcrud.relatedControllerType");
        if (relatedControllerString != null && relatedControllerTypeString != null) {
            FacesContext context = FacesContext.getCurrentInstance();
            Object relatedController = context.getApplication().getELResolver().getValue(context.getELContext(), null, relatedControllerString);
            try {
                Class<?> relatedControllerType = Class.forName(relatedControllerTypeString);
                Method detailSetupMethod = relatedControllerType.getMethod("detailSetup");
                return (String) detailSetupMethod.invoke(relatedController);
            } catch (ClassNotFoundException e) {
                throw new FacesException(e);
            } catch (NoSuchMethodException e) {
                throw new FacesException(e);
            } catch (IllegalAccessException e) {
                throw new FacesException(e);
            } catch (InvocationTargetException e) {
                throw new FacesException(e);
            }
        }
        return null;
    }

    /**
     * Borra la referencia al objeto Representado (Borrado sin persistencia).
     * @param resetFirstItem
     */
    public void reset(boolean resetFirstItem) {
        solicitudusuario = null;
        solicitudusuarios = null;
        itemCount = -1;
        if (resetFirstItem) {
            firstItem = 0;
        }
    }
    private Map<Object, String> asString = null;

    /**
     * Obtiene el mapeo del objeto actual en su representacion String
     * @return Mapeo de <code>Object, String</code>
     */
    public Map<Object, String> getAsString() {
        if (asString == null) {
            asString = new HashMap<Object, String>() {

                @Override
                public String get(Object key) {
                    if (key instanceof Object[]) {
                        Object[] keyAsArray = (Object[]) key;
                        if (keyAsArray.length == 0) {
                            return "(No Items)";
                        }
                        StringBuffer sb = new StringBuffer();
                        for (int i = 0; i < keyAsArray.length; i++) {
                            if (i > 0) {
                                sb.append("<br />");
                            }
                            sb.append(keyAsArray[i]);
                        }
                        return sb.toString();
                    }
                    return new SolicitudusuarioConverter().getAsString(FacesContext.getCurrentInstance(), null, (Solicitudusuario) key);
                }
            };
        }
        return asString;
    }

    /*
    public void validateCreate(FacesContext facesContext, UIComponent component, Object value) {
    SolicitudusuarioConverter converter = new SolicitudusuarioConverter();
    String newSolicitudusuarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, new Solicitudusuario());
    String solicitudusuarioString = converter.getAsString(FacesContext.getCurrentInstance(), null, solicitudusuario);
    if (!newSolicitudusuarioString.equals(solicitudusuarioString)) {
    createSetup();
    }
    }
     */
    //Variables privadas de uso del controller
    private String idUsuario;
    private String contrasenha;

    /**
     * Fija el Id del usuario al valor especificado
     * @param idUsuario
     */
    public void setIdUsuario(String idUsuario) {
        this.idUsuario = idUsuario;
    }

    /**
     * Obtiene el Id del Usuario
     * @return el Id del usuario
     */
    public String getIdUsuario() {
        return this.idUsuario;
    }

    /**
     * Fija la contraseña del usuario al valor especificado
     * @param Contrasenha
     */
    public void setContrasenha(String Contrasenha) {
        this.contrasenha = Contrasenha;
    }

    /**
     * Obtiene la contraseña del Usuario
     * @return la contraseña del usuario
     */
    public String getContrasenha() {
        return this.contrasenha;
    }
    /*
     * Funcion que realiza la creacion de la cuenta del usuario
     * Si la cuenta ya existe, se retorna un mensaje de la BD
     * Sino, crea el usuario
     */

    private String crearUsuario() {
        EntityManager em = getEntityManager();
        String x_usuario = this.getIdUsuario();
        String x_contrasenha = this.getContrasenha();
        String SQL;

        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        //Para la audioria, que dispara el trigger de auditoria
        Usuario usuarioLogeado = (Usuario) session.getAttribute("user");
        //solicitudreserva.setUserAudita(usuarioLogeado.getIdUsuario());
        try {
            SQL = "select f_insertar_usuario('" + x_usuario + "','" + x_contrasenha + "','" + usuarioLogeado.getIdUsuario() + "','" + solicitudusuario.getIddatospersonales().getIddatospersonales() + "')";
            Query q = em.createNativeQuery(SQL);
            Vector v = new Vector();
            v = (Vector) q.getSingleResult();
            String s = (String) v.get(0).toString();
            return s;
        } finally {
            em.close();
        }

    }
}
